import UIKit

// 基本游戏物体
class BaseGameObject {
    // 类型
    public enum _Type: Int {
        case NOTHING        // 什么也没有
        case WALL           // 墙
        case BACKGROUND     // 背景
        case DESTINATION    // 箱子的目的地
        case BOX            // 箱子
        case MAN            // 小人
    }

    // 移动结果
    public enum MoveResult: Int {
        case CANNOT_MOVE        // 本身不具有移动能力
        case NO_MOVE            // 没有移动
        case NORMAL_MOVED       // 正常移动
        case ARRIVED_ON_DEST    // 移动到目标上
        case LEFT_FROM_DEST     // 离开目标
    }

    internal let mDrawer: CGContext // 绘图者
    internal var mImage: UIImage!   // 图片
    internal let mType: _Type       // 类型
    internal var mX: Int            // 横向坐标
    internal var mY: Int            // 纵向坐标
    public static var sSize = 0     // 尺寸
    
    /**
     * 构造方法。
     * @param drawer    绘图者
     * @param type      类型
     * @param x, y      左上角坐标
     */
    public init(_ drawer: CGContext, type: _Type, x: Int, y: Int) {
        // 初始化成员
        mDrawer = drawer
        mType = type
        mX = x
        mY = y

        if type != .NOTHING {
            // 加载图片
            let imageFilePath = String(format: Const.IMAGE_FILE_NAME, type.rawValue)
            mImage = self.loadImage(imageFilePath)

            // 绘制自身
            self.draw()
        }
    }

    /**
     * 获取类型。
     */
    public var type: _Type {
        get {
            return mType
        }
    }

    /**
     * 绘制自身。
     */
    public func draw() {
        let rect = CGRect(x: mX * BaseGameObject.sSize, y: mY * BaseGameObject.sSize, width: BaseGameObject.sSize, height: BaseGameObject.sSize)
        mDrawer.draw(mImage.cgImage!, in: rect)
    }

    /**
     * 加载图片。
     * @param imageFilePath 图片文件路径
     * @return 图片
     */
    internal func loadImage(_ imageFilePath: String) -> UIImage {
        // 读取图片
        var image = UIImage(named: imageFilePath)!

        // 将图片180度倒转过来（因为ios默认图片是倒的）
        let rect = CGRect(x: 0, y: 0, width: BaseGameObject.sSize, height: BaseGameObject.sSize)
        let size = CGSize(width: BaseGameObject.sSize, height: BaseGameObject.sSize)
        UIGraphicsBeginImageContext(size)
        let backDrawer = UIGraphicsGetCurrentContext()!
        backDrawer.scaleBy(x: 1, y: -1)
        backDrawer.translateBy(x: 0, y: -CGFloat(BaseGameObject.sSize))
        image.draw(in: rect)
        image = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()

        return image
    }

    /**
     * 移动。
     * @param direction     方向
     * @param moveResult    移动结果
     * @return 被推动的箱子
     */
    public func move(_ direction: Int, moveResult: inout MoveResult) -> BaseGameObject! {
        moveResult = .CANNOT_MOVE
        return nil
    }
}
